package com.ruoyi.system.service.impl;

import java.util.List;
import java.util.UUID;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.system.domain.Vo.LoginUserVo;
import com.ruoyi.system.exception.PhoneException;
import com.ruoyi.system.domain.Bo.UsersBo;
import com.ruoyi.system.domain.Vo.UsersVo;
import com.ruoyi.system.exception.PhoneUnExistException;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.shiro.crypto.hash.Sha256Hash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.UsersMapper;
import com.ruoyi.system.domain.Users;
import com.ruoyi.system.service.IUsersService;

/**
 * 用户管理Service业务层处理
 * 
 * @author ruoyi
 * @date 2022-08-18
 */
@Service
public class UsersServiceImpl extends ServiceImpl<UsersMapper,Users> implements IUsersService
{
    @Autowired
    private UsersMapper usersMapper;

    @Override
    public boolean registerUser(UsersVo usersVo) {
        Users users = new Users();

        //检查用户手机号是否已经存在
        checkMobileUnique(usersVo.getUserPhone());

        //设置手机号，相当于设置用户账号
        users.setUserPhone(usersVo.getUserPhone());

        //注册用户随机生成一个用户名
        users.setUserName("用户"+ RandomStringUtils.randomAlphanumeric(10));

        //密码加密
        //sha256加密
        String salt = RandomStringUtils.randomAlphanumeric(20); //获取盐
        // System.out.println("加密前:"+usersVo.getUserPass());
        users.setUserPass(new Sha256Hash(usersVo.getUserPass(),salt).toHex());
        // System.out.println("加密后:"+users.getUserPass());
        //将盐存放进入数据库
        users.setSalt(salt);

        return usersMapper.insertUsers(users) > 0;
    }

    /**
     * 注册判断用户输入手机号是否存在
     * @param userPhone
     */
    @Override
    public void checkMobileUnique(String userPhone) throws PhoneException{
        Long count = usersMapper.selectPhone(userPhone);
        if (count>0) {
            throw new PhoneException();
        }
    }

    @Override
    public boolean updateUser(UsersVo usersVo){
        Users users = new Users();

        //检查用户手机号是否存在
        updateCheckMobileUnique(usersVo.getUserPhone());

        //密码加密
        //sha256加密
        String salt = RandomStringUtils.randomAlphanumeric(20); //获取盐
        System.out.println("加密前:"+usersVo.getUserPass());
        users.setUserPass(new Sha256Hash(usersVo.getUserPass(),salt).toHex());
        System.out.println("加密后:"+users.getUserPass());
        //将盐存放进入数据库
        users.setSalt(salt);

        return usersMapper.updateUsersByUserphone(users) > 0;
    }

    /**
     * 修改密码判断用户输入手机号是否存在
     * @param userPhone
     */
    @Override
    public void updateCheckMobileUnique(String userPhone) throws PhoneException{
        Long count = usersMapper.selectPhone(userPhone);
        if (count==0) {
            throw new PhoneUnExistException();
        }
    }

    /**
     * 查询用户管理
     * 
     * @param userId 用户管理主键
     * @return 用户管理
     */
    @Override
    public Users selectUsersByUserId(Integer userId)
    {
        return usersMapper.selectUsersByUserId(userId);
    }

    /**
     * 查询用户管理列表
     * 
     * @param users 用户管理
     * @return 用户管理
     */
    @Override
    public List<Users> selectUsersList(Users users)
    {
        return usersMapper.selectUsersList(users);
    }

    /**
     * 新增用户管理
     * 
     * @param usersBo 用户管理
     * @return 结果
     */
    @Override
    public int insertUsers(UsersBo usersBo)
    {
        Users users = BeanUtil.toBean(usersBo, Users.class);
        return usersMapper.insertUsers(users);
    }

    /**
     * 修改用户管理
     * 
     * @param users 用户管理
     * @return 结果
     */
    @Override
    public int updateUsers(Users users)
    {
        return usersMapper.updateUsers(users);
    }

    /**
     * 批量删除用户管理
     * 
     * @param userIds 需要删除的用户管理主键
     * @return 结果
     */
    @Override
    public int deleteUsersByUserIds(Integer[] userIds)
    {
        return usersMapper.deleteUsersByUserIds(userIds);
    }

    /**
     * 删除用户管理信息
     * 
     * @param userId 用户管理主键
     * @return 结果
     */
    @Override
    public int deleteUsersByUserId(Integer userId)
    {
        return usersMapper.deleteUsersByUserId(userId);
    }

    /**
     * 登录验证方法
     * @param usersVo
     * @return
     */
    @Override
    public LoginUserVo userLogin(UsersVo usersVo) {

        //判断用户名是否为空
        if (usersVo.getUserPhone()==null || usersVo.getUserPhone().equals("")) {
            return null;
        }

        //查询当前用户信息
        Users curUser = findUserByUserPhone(usersVo.getUserPhone());

        //判断输入密码和用户盐运算后是否能够得到加密后的密码
        if (curUser == null ||
                !curUser.getUserPass().equals(
                        new Sha256Hash(usersVo.getUserPass(),curUser.getSalt()).toHex())) {
            return null;
        }

        //验证密码成功后将密码置空
        curUser.setUserPass("");

        return BeanUtil.toBean(curUser, LoginUserVo.class);
    }

    public Users findUserByUserPhone(String userPhone){
        Users users = usersMapper.findUserByUserPhone(userPhone);
        return users;
    }
}
